from machine import I2C,UART,Pin
from  Sentry3  import *
import time

# 等待Sentry3完成操作系统的初始化。此等待时间不可去掉，避免出现Sentry3尚未初始化完毕主控器已经开发发送指令的情况
time.sleep(2)

# 选择UART或者I2C通讯模式，Sentry3出厂默认为I2C模式，短按模式按键可以切换
# 4种UART通讯模式：UART9600（标准协议指令），UART57600（标准协议指令），UART115200（标准协议指令），Simple9600（简单协议指令），
# 参看“简单协议指令”
# https://tosee.readthedocs.io/zh/latest/Common/Protocol/index.html#section-6
#########################################################################################################
# port = UART(2,rx=Pin(16),tx=Pin(17),baudrate=9600)
port = I2C(1,scl=Pin(22),sda=Pin(21),freq=400000)

# Sentry3通讯地址：0x60。如果I2C总线挂接多个设备，请避免出现地址冲突
Sentry3 = Sentry3(0x60)

err = Sentry3.begin(port)
print("Sentry3.begin: 0x%x"% err)
 
# 1、Sentry3消费版可以储存15张人脸数据
# 2、除了可以通过操作摇杆记忆/删除人脸数据外，还可以通过串口指令进行操作；
# 3、算法介绍参考
# https://tosee.readthedocs.io/zh/latest/Sentry2/Vision/index.html#chapter-vision-face-index
# 4、正常使用时，应由主控器发送指令控制Sentry3算法的开启与关闭，而非通过摇杆手动进行操作；
err = Sentry3.VisionBegin(sentry3_vision_e.kVisionFace)
print("Sentry3.VisionBegin(sentry3_vision_e.kVisionFace):0x%x"% err)


while True:
    # Sentry3不主动返回检测识别结果，需要主控板发送指令进行读取。读取的流程：首先读取识别结果的数量，接收到指令后，Sentry3会刷新结果数据，如果结果数量不为零，那么主控再发送指令读取结果的相关信息。请务必按此流程构建程序。
    obj_num = Sentry3.GetValue(sentry3_vision_e.kVisionFace, sentry_obj_info_e.kStatus)
    if obj_num:
        print("Totally %d persons: "%obj_num)
        for i in range(1,obj_num+1):
            print("person%d: "%i, end='')
            #当人脸高度不小于50时，才进行人脸判定，避免距离过远导致误识别
            h = Sentry3.GetValue(sentry3_vision_e.kVisionFace, sentry_obj_info_e.kHeightValue, i)            
            if h >= 50:
                #人脸标签=0，表示陌生人；人脸标签范围1-15，表示已经记忆的人脸；#人脸标签=200，表示戴口罩；
                l = Sentry3.GetValue(sentry3_vision_e.kVisionFace, sentry_obj_info_e.kLabel, i)
                if l == 0:
                    print("stranger, ", end='')
                elif l == 200:
                    print("masked  , ", end='')
                else:
                    print("id=%d   , "%l, end='')

            x = Sentry3.GetValue(sentry3_vision_e.kVisionFace, sentry_obj_info_e.kXValue, i)
            y = Sentry3.GetValue(sentry3_vision_e.kVisionFace, sentry_obj_info_e.kYValue, i)
            w = Sentry3.GetValue(sentry3_vision_e.kVisionFace, sentry_obj_info_e.kWidthValue, i)
            print("x=%d, y=%d, w=%d, h=%d"%(x, y, w, h))
            time.sleep(0.2)
        print("\n")
